Electronic design automation (EDA) has long been used to design and verify electronic hardware such as integrated circuits. Increasingly, however, new circuit designs have both a hardware component and a software component. For instance, an “embedded” system often includes a special-purpose hardware component that is installed in a general-purpose host computer system. A software component is developed to execute on one or more processors in the host system to allow the host system to interact with the installed hardware component.
One familiar example of an embedded system is a “software” modem. A software modem uses the software processing power of a host computer system to process data traffic. A software modem only needs enough special-purpose hardware to pass data back and forth between the computer system's processor and a telephone network. As with most embedded systems, the special-purpose hardware in a software modem is significantly less complicated than the hardware of a typical hardware modem. Simplifying the hardware usually results in smaller components and a lower price point, which is one reason hardware/software circuit designs are so popular.
Although there are numerous advantages to embedded circuit designs, designing the hardware and software components of these circuit designs to work together is no trivial matter. Ideally, a hardware/software system is simulated and verified before a physical prototype is produced. A logic simulator works well for simulating hardware, but does not work well for simulating software execution in hardware. Under most circumstances, even the fastest logic simulators can only simulate execution of a few software instructions every second. Given that a processor may execute hundreds of thousands, or even millions, of instructions per second, simulating software execution using a logic simulator is often simply too slow to be useful.
One solution to designing combined hardware/software systems is co-simulation. In co-simulation, the software component of the design is executed in a software execution domain. The software execution domain simulates execution of the software by the host computer system. Often times, software can be simulated at or near the desired execution speed of the host computer system.
With the software component being simulated in the software execution domain, only the hardware component of the design needs to be simulated in a logic simulator domain. In co-simulation, the two simulation domains are used together to model, or co-simulate, the entire hardware/software circuit design, including the interaction between the software and hardware components, as if the circuit design were embedded in a host system. Of course, the two simulation domains are generally very different. Using multiple simulation domains to efficiently simulate a circuit design presents a number of challenges.